package com.xy6.effectivejava.chapter02.item03;

/**
 * 传统的两私有一公开（私有构造方法、私有静态实例(懒实例化/直接实例化)、公开的静态获取方法）
 * 涉及线程安全问题（即使有多重检查锁也可以通过反射破坏单例），
 * 目前最为安全的实现单例的方法是通过内部静态enum的方法来实现，
 * 因为JVM会保证enum不能被反射并且构造器方法只执行一次。
 * 
 * @author zhang
 *
 */
public class EnumSingleton {

	private EnumSingleton(){}
	
	public static EnumSingleton getInstance(){
		return Singleton.INSTANCE.getInstance();
	}

	private static enum Singleton {
		INSTANCE;
		
		private EnumSingleton singleton;

		// jvm会保证此方法绝对只调用一次
		private Singleton(){
			singleton = new EnumSingleton();
		}
		
		public EnumSingleton getInstance(){
			return singleton;
		}
	}
	
	public static void main(String[] args){
		EnumSingleton obj1 = EnumSingleton.getInstance();
		EnumSingleton obj2 = EnumSingleton.getInstance();
		System.out.println(obj1 == obj2);
	}
	
}
